 /*******************************************************************************
  * Copyright (c) 2000, 2005 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
  *
  * Contributors:
  * IBM Corporation - initial API and implementation
  *******************************************************************************/
 package org.eclipse.core.internal.dtree;

 import org.eclipse.core.runtime.IPath;

 /**
  * The result of doing a lookup() in a data tree. Uses an instance
  * pool that assumes no more than POOL_SIZE instance will ever be
  * needed concurrently. Reclaims and reuses instances on an LRU basis.
  */
 public class DataTreeLookup {
     public IPath key;
     public boolean isPresent;
     public Object data;
     public boolean foundInFirstDelta;
     private static final int POOL_SIZE = 100;
     /**
      * The array of lookup instances available for use.
      */
     private static DataTreeLookup[] instancePool;
     /**
      * The index of the next available lookup instance.
      */
     private static int nextFree = 0;
     static {
         instancePool = new DataTreeLookup[POOL_SIZE];
         //fill the pool with objects
 for (int i = 0; i < POOL_SIZE; i++) {
             instancePool[i] = new DataTreeLookup();
         }
     }

     /**
      * Constructors for internal use only. Use factory methods.
      */
     private DataTreeLookup() {
         super();
     }

     /**
      * Factory method for creating a new lookup object.
      */
     public static DataTreeLookup newLookup(IPath nodeKey, boolean isPresent, Object data) {
         DataTreeLookup instance;
         synchronized (instancePool) {
             instance = instancePool[nextFree];
             nextFree = ++nextFree % POOL_SIZE;
         }
         instance.key = nodeKey;
         instance.isPresent = isPresent;
         instance.data = data;
         instance.foundInFirstDelta = false;
         return instance;
     }

     /**
      * Factory method for creating a new lookup object.
      */
     public static DataTreeLookup newLookup(IPath nodeKey, boolean isPresent, Object data, boolean foundInFirstDelta) {
         DataTreeLookup instance;
         synchronized (instancePool) {
             instance = instancePool[nextFree];
             nextFree = ++nextFree % POOL_SIZE;
         }
         instance.key = nodeKey;
         instance.isPresent = isPresent;
         instance.data = data;
         instance.foundInFirstDelta = foundInFirstDelta;
         return instance;
     }
 }

